/*
 * @Author: 0x9DEFA478
 * @Date: 2022-01-20 17:25:53
 * @LastEditTime: 2022-01-20 22:42:07
 * @LastEditors: 0x9DEFA478
 * @Description: 
 * QQ:2652450237
 * ============================================================================================================================================
 * 
 * 
 * 
 *                                                                                               ************      ****************************
 *                                                                                             ************      ****************************  
 *                                                                                           ************      ****************************    
 *                                                                                         ************      ****************************      
 *                                                                                       ************      ************                        
 *                                                                                     ************      ************                          
 *                                                                                   ************      ************                            
 *                                                                                 ************      ************                              
 *                                                                               ************      ************                                
 *                                                                             ************      ************                                  
 *                                                                           ************      ************                                    
 *                                                                         ************      ************                                      
 *                                                                       ************      ************                                        
 *                                                                     ************      ************                                          
 *                                                                   ************      ************                                            
 *                                                                 ************      ************                                              
 *                                                               ************      ************                                                
 *                                                             ************      ************                                                  
 *                                                           ************      ************                                                    
 *                                                         ************      ************                                                      
 *                                                       ************      ************                                                        
 *                                                     ************      ************                                                          
 *                                                   ************      ************                                                            
 *                                                 ************      ************                                                              
 *                                               ************      ************                                                                
 *                                             ************      ************                                                                  
 *                                           ************      ************                                                                    
 *                                         ************      ************                                                                      
 *                                       ************      ************                                                                        
 *                                     ************      ************                                                                          
 *                                   ************      ************                                                                            
 *                                 ************      ************                                                                              
 *                               ************      ************                                                                                
 *                             ************      ************                                                                                  
 *                           ************      ************                                                                                    
 *                         ************      ************                                                                                      
 *       ****************************      ************                                                                                        
 *     ****************************      ************                                                                                          
 *   ****************************      ************                                                                                            
 * ****************************      ************                                                                                              
 * 
 * 
 * 
 * ============================================================================================================================================
 * 
 */
#ifndef __ST7789_SPI_H_
#define __ST7789_SPI_H_
#include "H_Type.h"




//显示方向 0度
#define vST7789_SPI_Direction_0                                   0

//显示方向 90度
#define vST7789_SPI_Direction_90                                  90

//显示方向 180度
#define vST7789_SPI_Direction_180                                 180

//显示方向 270度
#define vST7789_SPI_Direction_270                                 270

//初始化时参数CmdSequenceBuffer的长度
#define vST7789_SPI_CmdSequenceBufferLength                       15


typedef struct{
  void* v;
  void (*Lock)(void*);//互斥锁定 可用于保证底层操作互斥
  void (*Unlock)(void*);//互斥解锁 可用于保证底层操作互斥
  void (*Reset)(void*);//复位调用
  void (*SPI_Transmit)(void*,void*,int,void*,int,int);//发送序列 (底层句柄v,指令序列,指令序列长度,数据序列,数据序列长度 传输速度(0:高速 其他:低速))
  void (*SPI_Transmit16Bit)(void*,void*,int,void*,int,int);//发送序列 (底层句柄v,指令序列,指令序列长度,数据序列,数据序列长度 传输速度(0:高速 其他:低速))
}ST7789_SPI_LL_Function;

typedef struct{
  
  //是否开显示
  volatile int IsDisplay;

  //显示方向
  int Direction;

  //Gram范围 (0度)
  struct{
    int X;
    int Y;
    int H;
    int W;
  }GRAMArea;

  //显示的范围
  struct{
    int X;
    int Y;
    int H;
    int W;
  }UpdateArea;
  
  int X_Offset;
  int Y_Offset;

  void* CmdSequenceBuffer;

  ST7789_SPI_LL_Function LL_Function;

}ST7789_SPI;




/**
 * @brief 显示位图 屏幕初始化(ST7789_ScreenInit())后使用
 * @param _this 要操作的对象
 * @param Bitmap 要显示的位图
 * @return 无
 */
void ST7789_Display(ST7789_SPI* _this,void* Bitmap);




/**
 * @brief 设置刷新位置和大小 屏幕初始化(ST7789_ScreenInit())后使用
 * @param _this 要设置的对象
 * @param X X坐标
 * @param Y Y坐标
 * @param W 宽度
 * @param H 高度
 * @return 无
 */
void ST7789_SetDisplayArea(ST7789_SPI* _this,int X,int Y,int W,int H);

/**
 * @brief 设置显示方向 屏幕初始化(ST7789_ScreenInit())后使用
 *        注意! 调用此方法后必须调用一次ST7789_SetDisplayArea()
 * @param _this 要设置的对象
 * @param Direction 方向vST7789_SPI_Direction_
 * @return 无
 */
void ST7789_SetDirection(ST7789_SPI* _this,int Direction);

/**
 * @brief 初始化屏幕
 * @param _this 要操作的对象
 * @return 无
 */
void ST7789_ScreenInit(ST7789_SPI* _this);

/**
 * @brief 屏幕反初始化
 * @param _this 要操作的对象
 * @return 无
 */
void ST7789_ScreenDeInit(ST7789_SPI* _this);

/**
 * @brief 屏幕句柄初始化
 * @param _this 要初始化的句柄
 * @param LL_Function 底层方法
 * @param X 有效GRAM X坐标
 * @param Y 有效GRAM Y坐标
 * @param W 有效GRAM 宽度
 * @param H 有效GRAM 高度
 * @return 无
 */
void ST7789_SPI_Init(ST7789_SPI* _this,ST7789_SPI_LL_Function* LL_Function,void* CmdSequenceBuffer
  ,int X,int Y,int W,int H);




#endif //__ST7789_SPI_H_
